#include<reg51.h>  			//头文件
unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};	
                             	//数码管显示0～9的段码表, 带小数点
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	
                            	//数码管显示0～9的段码表，不带小数点
unsigned char timer=0;		//timer记录中断次数
unsigned char second;        	//second储存秒
unsigned char key=0;		//key记录按键次数

main()				//主函数
{
	 TMOD=0x01;			//定时器T0方式1定时
	 ET0=1;                   	//允许定时器T0中断
EA=1;                    		//总中断允许
second=0;                		//设初始值
P0=discode1[second/10];   		//显示秒位0
P2=discode2[second%10];   		//显示0.1s位0
while(1)				 //循环
{	
	if((P3&0x80)==0x00)		//当按键被按下时
	{	 
		key++;			//按键次数加1
		switch(key)		//根据按键次数分三种情况
		{
			case 1:		//第一次按下为启动秒表计时
			TH0=0xee; 	  //向TH0写入初值的高8位
      TL0=0x00;	   	//向TL0写入初值的低8位，定时5ms
	TR0=1;         		//启动定时器T0
	break;
	case 2:        		//按下两次暂定秒表
	TR0=0;         		//关闭定时器T0
	break;
	case 3:        			//按下3次秒表清0
	key=0;         			//按键次数清
	second=0;      			//秒表清0
	P0=discode1[second/10];   P2=discode2[second%10];	//显示秒位0   				  	//显示0.1s位0
	break;
}
while((P3&0x80)==0x00);     		//如果按键时间过长在此循环
}
}
}
void int_T0() interrupt 1  using 0 		//定时器T0中断函数
{						
	TR0=0;		 	//停止计时，执行以下操作（会带来计时误差）
	TH0=0xee;	  	//向TH0写入初值的高8位
	TL0=0x00;	   	//向TL0写入初值的低8位，定时5ms
	timer++;   	   	//记录中断次数
	if (timer==20)	   	//中断20次，共计时20*5ms=100ms=0.1s
	{
		timer=0;    			//中断次数清0
		second++;   			//加0.1s
		P0=discode1[second/10];P2=discode2[second%10];  	//根据计时，即时显示秒位			//根据计时，即时显示0.1s位	 
		}
if(second==99) 		 //当计时到9.9s时
{
	TR0=0;			//停止计时
	second=0;		//秒数清0		
	key=2;	  		//按键数置2，当再次按下按键时，					//key++,即key=3，秒表清0复原	
}                           
else				//计时不到9.9s时
{
	TR0=1;			//启动定时器继续计时
}
}
